home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / xalan.jar / org / apache / xalan / xpath / XPath.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-04-12  |  23.0 KB  |  1,006 lines

  1. package org.apache.xalan.xpath;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.Serializable;
  6. import java.util.Vector;
  7. import org.apache.xalan.xpath.xml.PrefixResolver;
  8. import org.apache.xalan.xpath.xml.ProblemListener;
  9. import org.apache.xalan.xpath.xml.ProblemListenerDefault;
  10. import org.apache.xalan.xpath.xml.QName;
  11. import org.apache.xalan.xpath.xml.XSLMessages;
  12. import org.w3c.dom.DocumentFragment;
  13. import org.w3c.dom.Node;
  14. import org.w3c.dom.NodeList;
  15. import org.xml.sax.SAXException;
  16.  
  17. public class XPath implements Serializable {
  18.    static XBoolean m_true = new XBooleanStatic(true);
  19.    static XBoolean m_false = new XBooleanStatic(false);
  20.    String m_currentPattern;
  21.    static final int MAXTOKENQUEUESIZE = 500;
  22.    Object[] m_tokenQueue = new Object[500];
  23.    int m_tokenQueueSize;
  24.    int[] m_opMap;
  25.    public static final int MAPINDEX_LENGTH = 1;
  26.    static final boolean m_debug = false;
  27.    private transient ProblemListener m_problemListener;
  28.    static final boolean m_trace = false;
  29.    public static final double MATCH_SCORE_NONE = Double.NEGATIVE_INFINITY;
  30.    public static final double MATCH_SCORE_QNAME = (double)0.0F;
  31.    public static final double MATCH_SCORE_NSWILD = (double)-0.25F;
  32.    public static final double MATCH_SCORE_NODETEST = (double)-0.5F;
  33.    public static final double MATCH_SCORE_OTHER = (double)0.5F;
  34.    public static final int ENDOP = -1;
  35.    public static final int EMPTY = -2;
  36.    public static final int ELEMWILDCARD = -3;
  37.    public static final int OP_XPATH = 1;
  38.    public static final int OP_OR = 2;
  39.    public static final int OP_AND = 3;
  40.    public static final int OP_NOTEQUALS = 4;
  41.    public static final int OP_EQUALS = 5;
  42.    public static final int OP_LTE = 6;
  43.    public static final int OP_LT = 7;
  44.    public static final int OP_GTE = 8;
  45.    public static final int OP_GT = 9;
  46.    public static final int OP_PLUS = 10;
  47.    public static final int OP_MINUS = 11;
  48.    public static final int OP_MULT = 12;
  49.    public static final int OP_DIV = 13;
  50.    public static final int OP_MOD = 14;
  51.    public static final int OP_QUO = 15;
  52.    public static final int OP_NEG = 16;
  53.    public static final int OP_STRING = 17;
  54.    public static final int OP_BOOL = 18;
  55.    public static final int OP_NUMBER = 19;
  56.    public static final int OP_UNION = 20;
  57.    public static final int OP_LITERAL = 21;
  58.    public static final int OP_VARIABLE = 22;
  59.    public static final int OP_GROUP = 23;
  60.    public static final int OP_NUMBERLIT = 24;
  61.    public static final int OP_ARGUMENT = 25;
  62.    public static final int OP_EXTFUNCTION = 26;
  63.    public static final int OP_FUNCTION = 27;
  64.    public static final int OP_LOCATIONPATH = 28;
  65.    public static final int LOCATIONPATHEX_MASK = 65535;
  66.    public static final int LOCATIONPATHEX_ISSIMPLE = 65536;
  67.    public static final int OP_LOCATIONPATH_EX = 65564;
  68.    public static final int OP_PREDICATE = 29;
  69.    public static final int OP_MATCHPATTERN = 30;
  70.    public static final int OP_LOCATIONPATHPATTERN = 31;
  71.    public static final int NODETYPE_COMMENT = 1030;
  72.    public static final int NODETYPE_TEXT = 1031;
  73.    public static final int NODETYPE_PI = 1032;
  74.    public static final int NODETYPE_NODE = 1033;
  75.    public static final int NODENAME = 34;
  76.    public static final int NODETYPE_ROOT = 35;
  77.    public static final int NODETYPE_ANYELEMENT = 36;
  78.    public static final int FROM_ANCESTORS = 37;
  79.    public static final int FROM_ANCESTORS_OR_SELF = 38;
  80.    public static final int FROM_ATTRIBUTES = 39;
  81.    public static final int FROM_CHILDREN = 40;
  82.    public static final int FROM_DESCENDANTS = 41;
  83.    public static final int FROM_DESCENDANTS_OR_SELF = 42;
  84.    public static final int FROM_FOLLOWING = 43;
  85.    public static final int FROM_FOLLOWING_SIBLINGS = 44;
  86.    public static final int FROM_PARENT = 45;
  87.    public static final int FROM_PRECEDING = 46;
  88.    public static final int FROM_PRECEDING_SIBLINGS = 47;
  89.    public static final int FROM_SELF = 48;
  90.    public static final int FROM_NAMESPACE = 49;
  91.    public static final int FROM_ROOT = 55;
  92.    public static final int FUNC_CURRENT = 0;
  93.    public static final int FUNC_LAST = 1;
  94.    public static final int FUNC_POSITION = 2;
  95.    public static final int FUNC_COUNT = 3;
  96.    public static final int FUNC_ID = 4;
  97.    public static final int FUNC_KEY = 5;
  98.    public static final int FUNC_LOCAL_PART = 7;
  99.    public static final int FUNC_NAMESPACE = 8;
  100.    public static final int FUNC_QNAME = 9;
  101.    public static final int FUNC_GENERATE_ID = 10;
  102.    public static final int FUNC_NOT = 11;
  103.    public static final int FUNC_TRUE = 12;
  104.    public static final int FUNC_FALSE = 13;
  105.    public static final int FUNC_BOOLEAN = 14;
  106.    public static final int FUNC_NUMBER = 15;
  107.    public static final int FUNC_FLOOR = 16;
  108.    public static final int FUNC_CEILING = 17;
  109.    public static final int FUNC_ROUND = 18;
  110.    public static final int FUNC_SUM = 19;
  111.    public static final int FUNC_STRING = 20;
  112.    public static final int FUNC_STARTS_WITH = 21;
  113.    public static final int FUNC_CONTAINS = 22;
  114.    public static final int FUNC_SUBSTRING_BEFORE = 23;
  115.    public static final int FUNC_SUBSTRING_AFTER = 24;
  116.    public static final int FUNC_NORMALIZE_SPACE = 25;
  117.    public static final int FUNC_TRANSLATE = 26;
  118.    public static final int FUNC_CONCAT = 27;
  119.    public static final int FUNC_SUBSTRING = 29;
  120.    public static final int FUNC_STRING_LENGTH = 30;
  121.    public static final int FUNC_SYSTEM_PROPERTY = 31;
  122.    public static final int FUNC_LANG = 32;
  123.    public static final int FUNC_EXT_FUNCTION_AVAILABLE = 33;
  124.    public static final int FUNC_EXT_ELEM_AVAILABLE = 34;
  125.    public static final int FUNC_DOCLOCATION = 35;
  126.    public static final int FUNC_UNPARSED_ENTITY_URI = 36;
  127.    private static final int NUM_BUILT_IN_FUNCS = 37;
  128.    private static final int NUM_ALLOWABLE_ADDINS = 30;
  129.    private static Function[] m_functions = new Function[67];
  130.    private static int m_funcNextFreeIndex = 37;
  131.    public static final int MATCH_ATTRIBUTE = 94;
  132.    public static final int MATCH_ANY_ANCESTOR = 95;
  133.    public static final int MATCH_IMMEDIATE_ANCESTOR = 96;
  134.    public static final String PSEUDONAME_ANY = "*";
  135.    public static final String PSEUDONAME_ROOT = "/";
  136.    public static final String PSEUDONAME_TEXT = "#text";
  137.    public static final String PSEUDONAME_COMMENT = "#comment";
  138.    public static final String PSEUDONAME_PI = "#pi";
  139.    public static final String PSEUDONAME_OTHER = "*";
  140.    private static final int NEXT_FREE_ID = 99;
  141.  
  142.    public String getPatternString() {
  143.       return this.m_currentPattern;
  144.    }
  145.  
  146.    public Object[] getTokenQueue() {
  147.       return this.m_tokenQueue;
  148.    }
  149.  
  150.    public int getTokenQueueSize() {
  151.       return this.m_tokenQueueSize;
  152.    }
  153.  
  154.    public int[] getOpMap() {
  155.       return this.m_opMap;
  156.    }
  157.  
  158.    public XPath(ProblemListener var1) {
  159.       this.m_problemListener = var1;
  160.    }
  161.  
  162.    public XPath() {
  163.       this.m_problemListener = new ProblemListenerDefault();
  164.    }
  165.  
  166.    public void setProblemListener(ProblemListener var1) {
  167.       this.m_problemListener = var1;
  168.    }
  169.  
  170.    public ProblemListener getProblemListener() {
  171.       return this.m_problemListener;
  172.    }
  173.  
  174.    private XLocator createXLocatorHandler(XPathSupport var1) {
  175.       return var1.createXLocatorHandler();
  176.    }
  177.  
  178.    private void readObject(ObjectInputStream var1) throws IOException {
  179.       try {
  180.          var1.defaultReadObject();
  181.       } catch (ClassNotFoundException var3) {
  182.          throw new RuntimeException(XSLMessages.createXPATHMessage(68, new Object[]{((Throwable)var3).getMessage()}));
  183.       }
  184.    }
  185.  
  186.    public XObject execute(XPathSupport var1, Node var2, PrefixResolver var3) throws SAXException {
  187.       return this.execute(var1, var2, var3, (NodeCallback)null, (Object)null, false);
  188.    }
  189.  
  190.    public XObject execute(XPathSupport var1, Node var2, PrefixResolver var3, NodeCallback var4, Object var5, boolean var6) throws SAXException {
  191.       PrefixResolver var7 = var1.getNamespaceContext();
  192.       var1.setNamespaceContext(var3);
  193.       var1.setCurrentNode(var2);
  194.       Object var8 = null;
  195.  
  196.       try {
  197.          if (var5 != null) {
  198.             var1.pushXPathContext(this, var1, var2, var3);
  199.          }
  200.  
  201.          var13 = this.execute(var1, var2, 0, var4, var5, var6);
  202.          if (var5 != null) {
  203.             var1.popXPathContext();
  204.          }
  205.       } finally {
  206.          var1.setNamespaceContext(var7);
  207.          var1.setCurrentNode((Node)null);
  208.       }
  209.  
  210.       return var13;
  211.    }
  212.  
  213.    public double getMatchScore(XPathSupport var1, Node var2) throws SAXException {
  214.       double var3 = Double.NEGATIVE_INFINITY;
  215.       int var5 = 0;
  216.       if (this.m_opMap[var5] == 30) {
  217.          var5 = getFirstChildPos(var5);
  218.          XLocator var6 = var1.getXLocatorFromNode(var2);
  219.          if (var6 == null) {
  220.             var6 = var1.createXLocatorHandler();
  221.          }
  222.  
  223.          while(this.m_opMap[var5] == 31) {
  224.             int var7 = this.getNextOpPos(var5);
  225.             var3 = var6.locationPathPattern(this, var1, var2, var5);
  226.             if (var3 != Double.NEGATIVE_INFINITY) {
  227.                break;
  228.             }
  229.  
  230.             var5 = var7;
  231.          }
  232.       } else {
  233.          this.error(var2, 22);
  234.       }
  235.  
  236.       return var3;
  237.    }
  238.  
  239.    int getCountOfContextNodeList(XPath var1, XPathSupport var2, Node var3) throws SAXException {
  240.       if (var2.getThrowFoundIndex()) {
  241.          throw new FoundIndex();
  242.       } else {
  243.          NodeList var4 = var2.getContextNodeList();
  244.          if (var4 == null) {
  245.             XObject var5 = var2.reExecuteXPathContext(var1, var2, var3);
  246.             if (var5 == null || var5.getType() != 4) {
  247.                if (var2.getContextNodePosition() > 0) {
  248.                   throw new FoundIndex();
  249.                }
  250.  
  251.                return 0;
  252.             }
  253.  
  254.             var4 = var5.nodeset();
  255.          }
  256.  
  257.          return var4.getLength();
  258.       }
  259.    }
  260.  
  261.    int getPositionInContextNodeList(Node var1, XPathSupport var2) {
  262.       if (var2.getThrowFoundIndex()) {
  263.          throw new FoundIndex();
  264.       } else {
  265.          int var3 = var2.getContextNodePosition();
  266.          if (var3 >= 0) {
  267.             return var3;
  268.          } else {
  269.             var3 = -1;
  270.             if (var2.getContextNodeList() != null) {
  271.                int var4 = var2.getContextNodeList().getLength();
  272.  
  273.                for(int var5 = 0; var5 < var4; ++var5) {
  274.                   Node var6 = var2.getContextNodeList().item(var5);
  275.                   if (var6 != null && var6.equals(var1)) {
  276.                      var3 = var5 + 1;
  277.                      break;
  278.                   }
  279.                }
  280.             }
  281.  
  282.             return var3;
  283.          }
  284.       }
  285.    }
  286.  
  287.    void shrink() {
  288.       int[] var1 = this.m_opMap;
  289.       int var2 = this.m_opMap[1];
  290.       this.m_opMap = new int[var2 + 4];
  291.  
  292.       int var3;
  293.       for(var3 = 0; var3 < var2; ++var3) {
  294.          this.m_opMap[var3] = var1[var3];
  295.       }
  296.  
  297.       this.m_opMap[var3] = 0;
  298.       this.m_opMap[var3 + 1] = 0;
  299.       this.m_opMap[var3 + 2] = 0;
  300.       Object[] var4 = this.m_tokenQueue;
  301.       var2 = this.m_tokenQueueSize;
  302.       this.m_tokenQueue = new Object[var2 + 4];
  303.  
  304.       for(var3 = 0; var3 < var2; ++var3) {
  305.          this.m_tokenQueue[var3] = var4[var3];
  306.       }
  307.  
  308.       this.m_tokenQueue[var3] = null;
  309.       this.m_tokenQueue[var3 + 1] = null;
  310.       this.m_tokenQueue[var3 + 2] = null;
  311.    }
  312.  
  313.    public void installFunction(String var1, int var2, Function var3) {
  314.       m_functions[var2] = var3;
  315.    }
  316.  
  317.    public static int installFunction(String var0, Function var1) {
  318.       Object var3 = XPathProcessorImpl.m_functions.get(var0);
  319.       int var2;
  320.       if (var3 != null) {
  321.          var2 = (Integer)var3;
  322.       } else {
  323.          var2 = m_funcNextFreeIndex++;
  324.          XPathProcessorImpl.m_functions.put(var0, new Integer(var2));
  325.       }
  326.  
  327.       m_functions[var2] = var1;
  328.       return var2;
  329.    }
  330.  
  331.    protected XObject xpath(XPathSupport var1, Node var2, int var3) throws SAXException {
  332.       return this.execute(var1, var2, var3 + 2);
  333.    }
  334.  
  335.    // $FF: renamed from: or (org.apache.xalan.xpath.XPathSupport, org.w3c.dom.Node, int) org.apache.xalan.xpath.XBoolean
  336.    protected XBoolean method_0(XPathSupport var1, Node var2, int var3) throws SAXException {
  337.       var3 = getFirstChildPos(var3);
  338.       int var4 = this.getNextOpPos(var3);
  339.       XObject var6 = this.execute(var1, var2, var3);
  340.       XBoolean var5;
  341.       if (!var6.bool()) {
  342.          XObject var7 = this.execute(var1, var2, var4);
  343.          if (!var7.bool()) {
  344.             var5 = new XBoolean(false);
  345.          } else {
  346.             var5 = new XBoolean(true);
  347.          }
  348.       } else {
  349.          var5 = new XBoolean(true);
  350.       }
  351.  
  352.       return var5;
  353.    }
  354.  
  355.    protected XBoolean and(XPathSupport var1, Node var2, int var3) throws SAXException {
  356.       var3 = getFirstChildPos(var3);
  357.       int var4 = this.getNextOpPos(var3);
  358.       XObject var5 = this.execute(var1, var2, var3);
  359.       if (var5.bool()) {
  360.          XObject var6 = this.execute(var1, var2, var4);
  361.          return var6.bool() ? m_true : m_false;
  362.       } else {
  363.          return m_false;
  364.       }
  365.    }
  366.  
  367.    protected XBoolean notequals(XPathSupport var1, Node var2, int var3) throws SAXException {
  368.       var3 = getFirstChildPos(var3);
  369.       int var4 = this.getNextOpPos(var3);
  370.       XObject var5 = this.execute(var1, var2, var3);
  371.       XObject var6 = this.execute(var1, var2, var4);
  372.       return var5.notEquals(var6) ? m_true : m_false;
  373.    }
  374.  
  375.    protected XBoolean equals(XPathSupport var1, Node var2, int var3) throws SAXException {
  376.       var3 = getFirstChildPos(var3);
  377.       int var4 = this.getNextOpPos(var3);
  378.       XObject var5 = this.execute(var1, var2, var3, (NodeCallback)null, (Object)null, true);
  379.       XObject var6 = this.execute(var1, var2, var4, (NodeCallback)null, (Object)null, true);
  380.       return var5.equals(var6) ? m_true : m_false;
  381.    }
  382.  
  383.    protected XBoolean lte(XPathSupport var1, Node var2, int var3) throws SAXException {
  384.       var3 = getFirstChildPos(var3);
  385.       int var4 = this.getNextOpPos(var3);
  386.       XObject var5 = this.execute(var1, var2, var3);
  387.       XObject var6 = this.execute(var1, var2, var4);
  388.       return var5.lessThanOrEqual(var6) ? m_true : m_false;
  389.    }
  390.  
  391.    // $FF: renamed from: lt (org.apache.xalan.xpath.XPathSupport, org.w3c.dom.Node, int) org.apache.xalan.xpath.XBoolean
  392.    protected XBoolean method_1(XPathSupport var1, Node var2, int var3) throws SAXException {
  393.       var3 = getFirstChildPos(var3);
  394.       int var4 = this.getNextOpPos(var3);
  395.       XObject var5 = this.execute(var1, var2, var3);
  396.       XObject var6 = this.execute(var1, var2, var4);
  397.       return var5.lessThan(var6) ? m_true : m_false;
  398.    }
  399.  
  400.    protected XBoolean gte(XPathSupport var1, Node var2, int var3) throws SAXException {
  401.       var3 = getFirstChildPos(var3);
  402.       int var4 = this.getNextOpPos(var3);
  403.       XObject var5 = this.execute(var1, var2, var3);
  404.       XObject var6 = this.execute(var1, var2, var4);
  405.       return var5.greaterThanOrEqual(var6) ? m_true : m_false;
  406.    }
  407.  
  408.    // $FF: renamed from: gt (org.apache.xalan.xpath.XPathSupport, org.w3c.dom.Node, int) org.apache.xalan.xpath.XBoolean
  409.    protected XBoolean method_2(XPathSupport var1, Node var2, int var3) throws SAXException {
  410.       var3 = getFirstChildPos(var3);
  411.       int var4 = this.getNextOpPos(var3);
  412.       XObject var5 = this.execute(var1, var2, var3);
  413.       XObject var6 = this.execute(var1, var2, var4);
  414.       return var5.greaterThan(var6) ? m_true : m_false;
  415.    }
  416.  
  417.    protected XNumber plus(XPathSupport var1, Node var2, int var3) throws SAXException {
  418.       var3 = getFirstChildPos(var3);
  419.       int var4 = this.getNextOpPos(var3);
  420.       XObject var5 = this.execute(var1, var2, var3);
  421.       XObject var6 = this.execute(var1, var2, var4);
  422.       return new XNumber(var5.num() + var6.num());
  423.    }
  424.  
  425.    protected XNumber minus(XPathSupport var1, Node var2, int var3) throws SAXException {
  426.       var3 = getFirstChildPos(var3);
  427.       int var4 = this.getNextOpPos(var3);
  428.       XObject var5 = this.execute(var1, var2, var3);
  429.       XObject var6 = this.execute(var1, var2, var4);
  430.       return new XNumber(var5.num() - var6.num());
  431.    }
  432.  
  433.    protected XNumber mult(XPathSupport var1, Node var2, int var3) throws SAXException {
  434.       var3 = getFirstChildPos(var3);
  435.       int var4 = this.getNextOpPos(var3);
  436.       XObject var5 = this.execute(var1, var2, var3);
  437.       XObject var6 = this.execute(var1, var2, var4);
  438.       return new XNumber(var5.num() * var6.num());
  439.    }
  440.  
  441.    protected XNumber div(XPathSupport var1, Node var2, int var3) throws SAXException {
  442.       var3 = getFirstChildPos(var3);
  443.       int var4 = this.getNextOpPos(var3);
  444.       XObject var5 = this.execute(var1, var2, var3);
  445.       XObject var6 = this.execute(var1, var2, var4);
  446.       return new XNumber(var5.num() / var6.num());
  447.    }
  448.  
  449.    protected XNumber mod(XPathSupport var1, Node var2, int var3) throws SAXException {
  450.       var3 = getFirstChildPos(var3);
  451.       int var4 = this.getNextOpPos(var3);
  452.       XObject var5 = this.execute(var1, var2, var3);
  453.       XObject var6 = this.execute(var1, var2, var4);
  454.       return new XNumber(var5.num() % var6.num());
  455.    }
  456.  
  457.    protected XNumber quo(XPathSupport var1, Node var2, int var3) throws SAXException {
  458.       this.warn(5);
  459.       var3 = getFirstChildPos(var3);
  460.       int var4 = this.getNextOpPos(var3);
  461.       XObject var5 = this.execute(var1, var2, var3);
  462.       XObject var6 = this.execute(var1, var2, var4);
  463.       return new XNumber((double)((int)(var5.num() / var6.num())));
  464.    }
  465.  
  466.    protected XNumber neg(XPathSupport var1, Node var2, int var3) throws SAXException {
  467.       XObject var4 = this.execute(var1, var2, var3 + 2);
  468.       return new XNumber(-var4.num());
  469.    }
  470.  
  471.    protected XString string(XPathSupport var1, Node var2, int var3) throws SAXException {
  472.       XObject var4 = this.execute(var1, var2, var3 + 2);
  473.       return new XString(var4.str());
  474.    }
  475.  
  476.    protected XBoolean bool(XPathSupport var1, Node var2, int var3) throws SAXException {
  477.       XObject var4 = this.execute(var1, var2, var3 + 2);
  478.       return var4.bool() ? m_true : m_false;
  479.    }
  480.  
  481.    protected XNumber number(XPathSupport var1, Node var2, int var3) throws SAXException {
  482.       XObject var4 = this.execute(var1, var2, var3 + 2);
  483.       return new XNumber(var4.num());
  484.    }
  485.  
  486.    protected XNodeSet union(XPathSupport var1, Node var2, int var3, NodeCallback var4, Object var5) throws SAXException {
  487.       XLocator var6 = var1.getXLocatorFromNode(var2);
  488.       if (var6 == null) {
  489.          var6 = var1.createXLocatorHandler();
  490.       }
  491.  
  492.       XNodeSet var7 = var6.union(this, var1, var2, var3, var4, var5);
  493.       return var7;
  494.    }
  495.  
  496.    protected XString literal(XPathSupport var1, Node var2, int var3) {
  497.       var3 = getFirstChildPos(var3);
  498.       return (XString)this.m_tokenQueue[this.m_opMap[var3]];
  499.    }
  500.  
  501.    protected XObject variable(XPathSupport var1, Node var2, int var3) throws SAXException {
  502.       var3 = getFirstChildPos(var3);
  503.       String var4 = (String)this.m_tokenQueue[this.m_opMap[var3]];
  504.       QName var5 = new QName(var4, var1.getNamespaceContext());
  505.  
  506.       XObject var6;
  507.       try {
  508.          var6 = var1.getVariable(var5);
  509.       } catch (Exception var7) {
  510.          this.error(23, new Object[]{var4});
  511.          var6 = null;
  512.       }
  513.  
  514.       if (var6 == null) {
  515.          this.error(var2, 43, new Object[]{var4});
  516.       }
  517.  
  518.       return var6;
  519.    }
  520.  
  521.    protected XObject group(XPathSupport var1, Node var2, int var3) throws SAXException {
  522.       return this.execute(var1, var2, var3 + 2);
  523.    }
  524.  
  525.    protected XNumber numberlit(XPathSupport var1, Node var2, int var3) {
  526.       var3 = getFirstChildPos(var3);
  527.       return (XNumber)this.m_tokenQueue[this.m_opMap[var3]];
  528.    }
  529.  
  530.    protected XObject arg(XPathSupport var1, Node var2, int var3) throws SAXException {
  531.       return this.execute(var1, var2, var3 + 2);
  532.    }
  533.  
  534.    public XNodeSet locationPath(XPathSupport var1, Node var2, int var3, NodeCallback var4, Object var5, boolean var6) throws SAXException {
  535.       XLocator var7 = var1.getXLocatorFromNode(var2);
  536.       if (var7 == null) {
  537.          var7 = var1.createXLocatorHandler();
  538.       }
  539.  
  540.       XNodeSet var8 = var7.locationPath(this, var1, var2, var3, var4, var5, var6);
  541.       return var8;
  542.    }
  543.  
  544.    public XObject predicate(XPathSupport var1, Node var2, int var3) throws SAXException {
  545.       Object var4 = this.execute(var1, var2, var3 + 2, (NodeCallback)null, (Object)null, true);
  546.       int var5 = ((XObject)var4).getType();
  547.       if (var5 != 2 && var5 != 1) {
  548.          var4 = ((XObject)var4).bool() ? m_true : m_false;
  549.       }
  550.  
  551.       return (XObject)var4;
  552.    }
  553.  
  554.    protected MutableNodeList step(XPathSupport var1, Node var2, int var3) throws SAXException {
  555.       this.warn(var2, 6);
  556.       return null;
  557.    }
  558.  
  559.    protected XObject extfunction(XPathSupport var1, Node var2, int var3, String var4, String var5, Vector var6, Object var7) throws SAXException {
  560.       Object var9 = var1.extFunction(var4, var5, var6, var7);
  561.       Object var8;
  562.       if (var9 != null) {
  563.          if (var9 instanceof XObject) {
  564.             var8 = (XObject)var9;
  565.          } else if (var9 instanceof XLocator) {
  566.             XLocator var10 = (XLocator)var9;
  567.             var3 = this.getNextOpPos(var3 + 1);
  568.             var8 = var10.connectToNodes(this, var1, var2, var3, var6);
  569.          } else if (var9 instanceof String) {
  570.             var8 = new XString((String)var9);
  571.          } else if (var9 instanceof Boolean) {
  572.             var8 = (Boolean)var9 ? m_true : m_false;
  573.          } else if (var9 instanceof Double) {
  574.             var8 = new XNumber((Double)var9);
  575.          } else if (var9 instanceof DocumentFragment) {
  576.             var8 = new XRTreeFrag((DocumentFragment)var9);
  577.          } else if (var9 instanceof Node) {
  578.             var3 = this.getNextOpPos(var3);
  579.             XNodeSet var18 = null;
  580.             if (var3 < this.m_opMap[1] && (this.m_opMap[var3] & '\uffff') == 28) {
  581.                var18 = this.locationPath(var1, (Node)var9, var3, (NodeCallback)null, (Object)null, false);
  582.             }
  583.  
  584.             var8 = var18 == null ? new XNodeSet((Node)var9) : var18;
  585.          } else if (var9 instanceof NodeList) {
  586.             var3 = this.getNextOpPos(var3);
  587.             XNodeSet var19 = null;
  588.             if (var3 < this.m_opMap[1] && (this.m_opMap[var3] & '\uffff') == 28) {
  589.                NodeList var11 = (NodeList)var9;
  590.                int var12 = var11.getLength();
  591.  
  592.                for(int var13 = 0; var13 < var12; ++var13) {
  593.                   XNodeSet var14 = this.locationPath(var1, var11.item(var13), var3, (NodeCallback)null, (Object)null, false);
  594.                   if (var14 == null) {
  595.                      var19 = var14;
  596.                   } else {
  597.                      var19.mutableNodeset().addNodes(var14.nodeset());
  598.                   }
  599.                }
  600.             }
  601.  
  602.             var8 = var19 == null ? new XNodeSet((NodeList)var9) : var19;
  603.          } else {
  604.             var8 = new XObject(var9);
  605.          }
  606.       } else {
  607.          var8 = new XNull();
  608.       }
  609.  
  610.       return (XObject)var8;
  611.    }
  612.  
  613.    protected XObject matchPattern(XPathSupport var1, Node var2, int var3) throws SAXException {
  614.       Object var4;
  615.       int var5;
  616.       for(var4 = null; this.m_opMap[var3] == 31; var3 = var5) {
  617.          var5 = this.getNextOpPos(var3);
  618.          var4 = this.execute(var1, var2, var3);
  619.          if (((XObject)var4).num() != Double.NEGATIVE_INFINITY) {
  620.             break;
  621.          }
  622.       }
  623.  
  624.       if (var4 == null) {
  625.          var4 = new XNumber(Double.NEGATIVE_INFINITY);
  626.       }
  627.  
  628.       return (XObject)var4;
  629.    }
  630.  
  631.    protected XNumber locationPathPattern(XPathSupport var1, Node var2, int var3) throws SAXException {
  632.       XLocator var4 = var1.getXLocatorFromNode(var2);
  633.       if (var4 == null) {
  634.          var4 = var1.createXLocatorHandler();
  635.       }
  636.  
  637.       double var5 = var4.locationPathPattern(this, var1, var2, var3);
  638.       return new XNumber(var5);
  639.    }
  640.  
  641.    public Vector getTargetElementStrings() {
  642.       Vector var1 = new Vector();
  643.  
  644.       int var3;
  645.       for(int var2 = 2; this.m_opMap[var2] == 31; var2 = var3) {
  646.          var3 = this.getNextOpPos(var2);
  647.  
  648.          int var4;
  649.          for(var2 = getFirstChildPos(var2); this.m_opMap[var2] != -1; var2 = var4) {
  650.             var4 = this.getNextOpPos(var2);
  651.             int var5 = this.m_opMap[var4];
  652.             if (var5 == 29 || var5 == -1) {
  653.                int var6 = this.m_opMap[var2];
  654.                var2 += 3;
  655.                switch (var6) {
  656.                   case 27:
  657.                      var1.addElement("*");
  658.                      break;
  659.                   case 55:
  660.                      var1.addElement("/");
  661.                      break;
  662.                   case 94:
  663.                   case 95:
  664.                   case 96:
  665.                      int var7 = this.m_opMap[var2];
  666.                      ++var2;
  667.                      switch (var7) {
  668.                         case 34:
  669.                            int var8 = this.m_opMap[var2 + 1];
  670.                            if (var8 >= 0) {
  671.                               String var9 = (String)this.m_tokenQueue[var8];
  672.                               if (var9.equals("*")) {
  673.                                  var1.addElement("*");
  674.                               } else {
  675.                                  var1.addElement(var9);
  676.                               }
  677.                            } else {
  678.                               var1.addElement("*");
  679.                            }
  680.                            break;
  681.                         case 35:
  682.                            var1.addElement("/");
  683.                            break;
  684.                         case 36:
  685.                            var1.addElement("*");
  686.                            break;
  687.                         case 1030:
  688.                            var1.addElement("#comment");
  689.                            break;
  690.                         case 1031:
  691.                            var1.addElement("#text");
  692.                            break;
  693.                         case 1032:
  694.                            var1.addElement("*");
  695.                            break;
  696.                         case 1033:
  697.                            var1.addElement("*");
  698.                            break;
  699.                         default:
  700.                            var1.addElement("*");
  701.                      }
  702.                }
  703.             }
  704.          }
  705.       }
  706.  
  707.       return var1;
  708.    }
  709.  
  710.    private XObject executeExtension(XPathSupport var1, Node var2, int var3) throws SAXException {
  711.       int var4 = var3 + this.m_opMap[var3 + 1] - 1;
  712.       var3 = getFirstChildPos(var3);
  713.       String var5 = (String)this.m_tokenQueue[this.m_opMap[var3]];
  714.       ++var3;
  715.       String var6 = (String)this.m_tokenQueue[this.m_opMap[var3]];
  716.       ++var3;
  717.  
  718.       Vector var7;
  719.       int var8;
  720.       for(var7 = new Vector(); var3 < var4; var3 = var8) {
  721.          var8 = this.getNextOpPos(var3);
  722.          var7.addElement(this.execute(var1, var2, var3));
  723.       }
  724.  
  725.       return this.extfunction(var1, var2, var3, var5, var6, var7, String.valueOf(this.m_opMap[var3]) + String.valueOf(this.hashCode()));
  726.    }
  727.  
  728.    XObject executeFunction(XPathSupport var1, Node var2, int var3) throws SAXException {
  729.       int var4 = var3 + this.m_opMap[var3 + 1] - 1;
  730.       var3 = getFirstChildPos(var3);
  731.       int var5 = this.m_opMap[var3];
  732.       ++var3;
  733.       if (var5 != -1) {
  734.          return m_functions[var5].execute(this, var1, var2, var3, var5, var4);
  735.       } else {
  736.          this.warn(7);
  737.          return null;
  738.       }
  739.    }
  740.  
  741.    public XObject execute(XPathSupport var1, Node var2, int var3) throws SAXException {
  742.       int var4 = this.m_opMap[var3];
  743.       switch (var4) {
  744.          case 1:
  745.             return this.execute(var1, var2, var3 + 2);
  746.          case 2:
  747.             return this.method_0(var1, var2, var3);
  748.          case 3:
  749.             return this.and(var1, var2, var3);
  750.          case 4:
  751.             return this.notequals(var1, var2, var3);
  752.          case 5:
  753.             return this.equals(var1, var2, var3);
  754.          case 6:
  755.             return this.lte(var1, var2, var3);
  756.          case 7:
  757.             return this.method_1(var1, var2, var3);
  758.          case 8:
  759.             return this.gte(var1, var2, var3);
  760.          case 9:
  761.             return this.method_2(var1, var2, var3);
  762.          case 10:
  763.             return this.plus(var1, var2, var3);
  764.          case 11:
  765.             return this.minus(var1, var2, var3);
  766.          case 12:
  767.             return this.mult(var1, var2, var3);
  768.          case 13:
  769.             return this.div(var1, var2, var3);
  770.          case 14:
  771.             return this.mod(var1, var2, var3);
  772.          case 15:
  773.             return this.quo(var1, var2, var3);
  774.          case 16:
  775.             return this.neg(var1, var2, var3);
  776.          case 17:
  777.             return this.string(var1, var2, var3);
  778.          case 18:
  779.             return this.bool(var1, var2, var3);
  780.          case 19:
  781.             return this.number(var1, var2, var3);
  782.          case 20:
  783.             return this.union(var1, var2, var3, (NodeCallback)null, (Object)null);
  784.          case 21:
  785.             return this.literal(var1, var2, var3);
  786.          case 22:
  787.             return this.variable(var1, var2, var3);
  788.          case 23:
  789.             return this.group(var1, var2, var3);
  790.          case 24:
  791.             return this.numberlit(var1, var2, var3);
  792.          case 25:
  793.             return this.arg(var1, var2, var3);
  794.          case 26:
  795.             return this.executeExtension(var1, var2, var3);
  796.          case 27:
  797.             return this.executeFunction(var1, var2, var3);
  798.          case 28:
  799.             return this.locationPath(var1, var2, var3, (NodeCallback)null, (Object)null, false);
  800.          case 29:
  801.             return null;
  802.          case 30:
  803.             return this.matchPattern(var1, var2, var3 + 2);
  804.          case 31:
  805.             return this.locationPathPattern(var1, var2, var3);
  806.          default:
  807.             if (var4 == 65564) {
  808.                return this.locationPath(var1, var2, var3, (NodeCallback)null, (Object)null, false);
  809.             } else {
  810.                this.error(var2, 24, new Object[]{Integer.toString(this.m_opMap[var3])});
  811.                return null;
  812.             }
  813.       }
  814.    }
  815.  
  816.    public XObject execute(XPathSupport var1, Node var2, int var3, NodeCallback var4, Object var5, boolean var6) throws SAXException {
  817.       int var7 = this.m_opMap[var3];
  818.       switch (var7) {
  819.          case 1:
  820.             return this.execute(var1, var2, var3 + 2, var4, var5, var6);
  821.          case 2:
  822.             return this.method_0(var1, var2, var3);
  823.          case 3:
  824.             return this.and(var1, var2, var3);
  825.          case 4:
  826.             return this.notequals(var1, var2, var3);
  827.          case 5:
  828.             return this.equals(var1, var2, var3);
  829.          case 6:
  830.             return this.lte(var1, var2, var3);
  831.          case 7:
  832.             return this.method_1(var1, var2, var3);
  833.          case 8:
  834.             return this.gte(var1, var2, var3);
  835.          case 9:
  836.             return this.method_2(var1, var2, var3);
  837.          case 10:
  838.             return this.plus(var1, var2, var3);
  839.          case 11:
  840.             return this.minus(var1, var2, var3);
  841.          case 12:
  842.             return this.mult(var1, var2, var3);
  843.          case 13:
  844.             return this.div(var1, var2, var3);
  845.          case 14:
  846.             return this.mod(var1, var2, var3);
  847.          case 15:
  848.             return this.quo(var1, var2, var3);
  849.          case 16:
  850.             return this.neg(var1, var2, var3);
  851.          case 17:
  852.             return this.string(var1, var2, var3);
  853.          case 18:
  854.             return this.bool(var1, var2, var3);
  855.          case 19:
  856.             return this.number(var1, var2, var3);
  857.          case 20:
  858.             return this.union(var1, var2, var3, var4, var5);
  859.          case 21:
  860.             return this.literal(var1, var2, var3);
  861.          case 22:
  862.             return this.variable(var1, var2, var3);
  863.          case 23:
  864.             return this.group(var1, var2, var3);
  865.          case 24:
  866.             return this.numberlit(var1, var2, var3);
  867.          case 25:
  868.             return this.arg(var1, var2, var3);
  869.          case 26:
  870.             return this.executeExtension(var1, var2, var3);
  871.          case 27:
  872.             return this.executeFunction(var1, var2, var3);
  873.          case 28:
  874.             return this.locationPath(var1, var2, var3, var4, var5, var6);
  875.          case 29:
  876.             return null;
  877.          case 30:
  878.             return this.matchPattern(var1, var2, var3 + 2);
  879.          case 31:
  880.             return this.locationPathPattern(var1, var2, var3);
  881.          default:
  882.             if (var7 == 65564) {
  883.                return this.locationPath(var1, var2, var3, var4, var5, var6);
  884.             } else {
  885.                this.error(var2, 24, new Object[]{Integer.toString(this.m_opMap[var3])});
  886.                return null;
  887.             }
  888.       }
  889.    }
  890.  
  891.    public int getOp(int var1) {
  892.       return this.m_opMap[var1];
  893.    }
  894.  
  895.    public int getNextOpPos(int var1) {
  896.       return var1 + this.m_opMap[var1 + 1];
  897.    }
  898.  
  899.    public static int getNextOpPos(int[] var0, int var1) {
  900.       return var1 + var0[var1 + 1];
  901.    }
  902.  
  903.    public static int getFirstChildPos(int var0) {
  904.       return var0 + 2;
  905.    }
  906.  
  907.    public int getArgLengthOfStep(int var1) {
  908.       return this.m_opMap[var1 + 1 + 1] - 3;
  909.    }
  910.  
  911.    public static int getFirstChildPosOfStep(int var0) {
  912.       return var0 + 3;
  913.    }
  914.  
  915.    private final void trace(String var1) {
  916.       System.out.println(var1);
  917.    }
  918.  
  919.    void warn(int var1) throws SAXException {
  920.       this.warn((Node)null, var1, (Object[])null);
  921.    }
  922.  
  923.    void warn(int var1, Object[] var2) throws SAXException {
  924.       this.warn((Node)null, var1, var2);
  925.    }
  926.  
  927.    void warn(Node var1, int var2) throws SAXException {
  928.       this.warn(var1, var2, (Object[])null);
  929.    }
  930.  
  931.    void warn(Node var1, int var2, Object[] var3) throws SAXException {
  932.       String var4 = XSLMessages.createXPATHWarning(var2, var3);
  933.       boolean var5 = this.m_problemListener.problem((short)4, (short)1, (Object)null, var1, var4, (String)null, 0, 0);
  934.       if (var5) {
  935.          throw new XPathException(var4);
  936.       }
  937.    }
  938.  
  939.    // $FF: renamed from: assert (boolean, java.lang.String) void
  940.    private void method_3(boolean var1, String var2) throws SAXException {
  941.       if (!var1) {
  942.          this.error((Node)null, 30, new Object[]{var2});
  943.       }
  944.  
  945.    }
  946.  
  947.    void error(int var1) throws SAXException {
  948.       this.error((Node)null, var1, (Object[])null);
  949.    }
  950.  
  951.    void error(int var1, Object[] var2) throws SAXException {
  952.       this.error((Node)null, var1, var2);
  953.    }
  954.  
  955.    void error(Node var1, int var2) throws SAXException {
  956.       this.error(var1, var2, (Object[])null);
  957.    }
  958.  
  959.    void error(Node var1, int var2, Object[] var3) throws SAXException {
  960.       String var4 = XSLMessages.createXPATHMessage(var2, var3);
  961.       String var5 = (this.m_currentPattern != null ? "pattern = '" + this.m_currentPattern + "'\n" : "") + var4;
  962.       boolean var6 = this.m_problemListener.problem((short)4, (short)2, (Object)null, var1, var5, (String)null, 0, 0);
  963.       if (var6) {
  964.          throw new XPathException(var5);
  965.       }
  966.    }
  967.  
  968.    static {
  969.       m_functions[0] = new FuncLoader("FuncCurrent", 0);
  970.       m_functions[1] = new FuncLoader("FuncLast", 1);
  971.       m_functions[2] = new FuncLoader("FuncPosition", 2);
  972.       m_functions[3] = new FuncLoader("FuncCount", 3);
  973.       m_functions[4] = new FuncLoader("FuncId", 4);
  974.       m_functions[5] = new FuncLoader("FuncKey", 5);
  975.       m_functions[7] = new FuncLoader("FuncLocalPart", 7);
  976.       m_functions[8] = new FuncLoader("FuncNamespace", 8);
  977.       m_functions[9] = new FuncLoader("FuncQname", 9);
  978.       m_functions[10] = new FuncLoader("FuncGenerateId", 10);
  979.       m_functions[11] = new FuncLoader("FuncNot", 11);
  980.       m_functions[12] = new FuncLoader("FuncTrue", 12);
  981.       m_functions[13] = new FuncLoader("FuncFalse", 13);
  982.       m_functions[14] = new FuncLoader("FuncBoolean", 14);
  983.       m_functions[32] = new FuncLoader("FuncLang", 32);
  984.       m_functions[15] = new FuncLoader("FuncNumber", 15);
  985.       m_functions[16] = new FuncLoader("FuncFloor", 16);
  986.       m_functions[17] = new FuncLoader("FuncCeiling", 17);
  987.       m_functions[18] = new FuncLoader("FuncRound", 18);
  988.       m_functions[19] = new FuncLoader("FuncSum", 19);
  989.       m_functions[20] = new FuncLoader("FuncString", 20);
  990.       m_functions[21] = new FuncLoader("FuncStartsWith", 21);
  991.       m_functions[22] = new FuncLoader("FuncContains", 22);
  992.       m_functions[23] = new FuncLoader("FuncSubstringBefore", 23);
  993.       m_functions[24] = new FuncLoader("FuncSubstringAfter", 24);
  994.       m_functions[25] = new FuncLoader("FuncNormalizeSpace", 25);
  995.       m_functions[26] = new FuncLoader("FuncTranslate", 26);
  996.       m_functions[27] = new FuncLoader("FuncConcat", 27);
  997.       m_functions[31] = new FuncLoader("FuncSystemProperty", 31);
  998.       m_functions[33] = new FuncLoader("FuncExtFunctionAvailable", 33);
  999.       m_functions[34] = new FuncLoader("FuncExtElementAvailable", 34);
  1000.       m_functions[29] = new FuncLoader("FuncSubstring", 29);
  1001.       m_functions[30] = new FuncLoader("FuncStringLength", 30);
  1002.       m_functions[35] = new FuncLoader("FuncDoclocation", 35);
  1003.       m_functions[36] = new FuncLoader("FuncUnparsedEntityURI", 36);
  1004.    }
  1005. }
  1006.